<?php
/**
 * @知果汇后台
 * 数据库增删改查封装模型
 * @2017-12-26
 * @author 潘龙兵
 * return array|string
 */

namespace app\data;

use think\Model;
use think\Db;

/**
 *
 * Class Data
 * @package app\data
 */
class Data extends Model
{
    protected $tableName;

    //构造方法，实例化表名
    public function __construct($tableName = '')
    {
        $this->tableName = $tableName;
    }

    /**
     * 查询一条数据
     * @param array $where
     * @param string $field
     * @return array|false|mixed|\PDOStatement|string|Model
     */
    public function _find($where = [], $field = '*')
    {
        return Db::name($this->tableName)->field($field)->where($where)->find();
    }

    /**
     * API接口分页查询数据
     * @param string $page
     * @param array $where
     * @param string $field
     * @param string $limit
     * @param string $order
     * @param string $sort
     * @return array|false|mixed|\PDOStatement|string|Model
     */
    public function selectPage($page, $where = [], $field = '*', $limit = '10', $order = 'time', $sort = 'desc')
    {
        return Db::name($this->tableName)->field($field)->where($where)->limit($limit)->page($page)->order($order . ' ' . $sort)->select();
    }

    /**
     * API接口查询不分页数据
     * @param array $where 查询条件
     * @param string $field 查询字段
     * @param string $order 排序
     * @param string $limit 条数
     * @return false|\PDOStatement|string|\think\Collection  返回一个数组
     */
    public function selectAll($where = [], $field = '*', $order = 'time', $limit = '')
    {
        // echo 123;exit;
        return Db::name($this->tableName)->where($where)->field($field)->order($order)->limit($limit)->select();
    }

    /**
     * @param string $where
     * @return int|string
     * 聚合函数
     */
    public function count($where)
    {
        return Db::name($this->tableName)->where($where)->count();
    }

    /**
     *联表查询总数
     * @param string $where
     * @return int|string
     * 聚合函数
     */
    public function countJion($where, $join = [], $alias)
    {
        // echo 5;exit;
        // dump($join);exit;
        return Db::name($this->tableName)->alias($alias)->join($join[0], $join[1])->where($where)->count();
    }


    /**
     * 联表分页查询
     * @param $join
     * @param array $where
     * @param string $field
     * @param string $order
     * @param string $limit
     * @return false|\PDOStatement|string|\think\Collection
     */
    public function joinPage($page, $join, $alias, $where = [], $field = '*', $limit = '10', $order = 'time', $sort = 'desc')
    {
        return Db::name($this->tableName)->alias($alias)->field($field)->join($join[0], $join[1])->where($where)->order($order)->limit($limit)->page($page)->select();
    }

    /**
     * 返回某个字段的值
     * @param string $where
     * @param mixed|null $field
     * @return mixed
     */
    public function value($where, $field)
    {
        return Db::name($this->tableName)->where($where)->value($field);
    }

    /**
     * 更新某个字段的值
     * @param array|string $where
     * @param mixed|string $data
     * @return int
     */
    public function setField($where, $data)
    {
        return Db::name($this->tableName)->where($where)->setField($data);
    }

    /**
     * 连表查询单条信息
     * @param $join
     * @param array $where
     * @param string $field
     * @return array|false|\PDOStatement|string|Model
     */
    public function joinOne($join, $where = [], $field = '', $alias)
    {
        return Db::name($this->tableName)->alias($alias)->field($field)->join($join[0], $join[1])->where($where)->find();
    }

    /**
     * 统计
     * @param string $where
     * @param $field
     * @return float|int
     */
    public function sum($where, $field)
    {
        return Db::name($this->tableName)->where($where)->sum($field);
    }

//插入

    /**
     * @param array $data 插入的数据
     * @return mixed 返回新增数据的自增主键
     * 插入数据的方法
     */
    public function insertData($data = [])
    {
        return Db::name($this->tableName)->insertGetId($data);
    }

    /**
     * @param $data
     * @return int|string
     * 添加数据
     */
    public function _insert($data)
    {
        return Db::name($this->tableName)->insert($data);
    }

    /**
     * @param array $data
     * @return int|string
     * 插入多条数据
     */
    public function insertAll($data = [])
    {
        return Db::name($this->tableName)->insertAll($data);
    }


//更新

    /**
     * @param array $data 更新数据
     * @param array $where 更新条件可为空，如果为空则更新数据需包含主键
     * @return mixed
     * update 方法返回影响数据的条数，没修改任何数据返回 0
     */
    public function _update($data = [], $where = [])
    {
        if (empty($where)) {
            return Db::name($this->tableName)->update($data);
        }
        return Db::name($this->tableName)->where($where)->update($data);
    }

    /**
     * @param array $where 自增条件
     * @param string $field 自增字段名称
     * @param int $value 自增值
     * @return mixeds 方法返回影响数据的条数
     * 自增一个字段的值
     */
    public function _setInc($where = [], $field = '', $value = 1)
    {
        return Db::name($this->tableName)->where($where)->setInc($field, $value);
    }

    /**
     * @param array $where 自减条件
     * @param string $field 自减字段名称
     * @param int $value 自减值
     * @return mixed 方法返回影响数据的条数
     * 自减一个字段的值
     */
    public function _setDec($where = [], $field = '', $value = 1)
    {
        return Db::name($this->tableName)->where($where)->setDec($field, $value);
    }

    /**
     * @param  int $id 主键的值
     * @return  mixed 方法返回影响数据的条数，没有删除返回 0
     * 根据主键删除一条数据
     */
    public function deleteDaPtaByPrimaryKey($id = 0)
    {
        return Db::name($this->tableName)->delete($id);
    }

//删除

    /**
     * @param array $where 删除条件
     * @return mixed  delete 方法返回影响数据的条数，没有删除返回 0
     * 根据条件删除数据
     */
    public function deleteByWhere($where = [])
    {
        return Db::name($this->tableName)->where($where)->delete();
    }

    /**
     * @param array $where 查询条件
     * @param int $page 每页显示的数据
     * @param string $order
     * @param array $query 搜索条件
     * @param array $join 链表
     * @param string $filed 查询字段
     * @param int $currentPage 当前页码
     * @return mixed         返回一个数据对象
     * 查询数据的方法 带分页
     */
    public function page($where = [], $order = '', $page = 20, $query = [], $join = [], $filed = '*', $currentPage = 1)
    {
        return Db::name($this->tableName)->alias('a')->field($filed)->join($join)->where($where)->order($order)->paginate($page, false, ['query' => $query, 'var_page' => 'page', 'page' => $currentPage]);
    }

    /**
     * @param array $where
     * @param string $order
     * @param int $page
     * @param array $query
     * @param string $filed
     * @param int $currentPage
     * @return \think\Paginator
     */
    public function pageSelf($where = [], $order = '', $page = 20, $query = [], $filed = '*', $currentPage = 1)
    {
        return Db::name($this->tableName)->alias('a')->field($filed)->where($where)->order($order)->paginate($page, false, ['query' => $query, 'var_page' => 'page', 'page' => $currentPage]);
    }


    /**
     * 记录后台操作日志
     * @param $action
     * @return int|string
     */
    public function addAdminLog($action)
    {
        $id = _zgh_user_info();
        $username = Db::name('admin')->where("id = $id")->value('username');
        // 插入操作日志
        $add['uid'] = $id;
        $add['uname'] = $username;
        $add['uip'] = ip2long($_SERVER["REMOTE_ADDR"]);
        $add['log_action'] = $action;
        $add['log_time'] = time();
        return Db::name('admin_log')->insert($add);
    }


    /**
     * @param string $alias 当前表别名
     * @param array $join 默认 INNER JOIN: 举例 [[表名1，条件1，类型1],[表名2，条件2，类型2],]
     * $join = [['auth_group_access c','a.id=c.uid','left'],];
     * @param array $where
     * @param string $field
     * @param string $order
     * @param string $limit
     * @return mixed
     */
    public function joinData($alias = 'a', $join = [], $where = [], $field = '*', $order = '', $limit = '')
    {
        return Db::name($this->tableName)->alias($alias)->join($join)->where($where)->field($field)->order($order)->limit($limit)->select();
    }

    /**
     * @param string $distinct
     * @param string $alias
     * @param array $join
     * @param $where
     * @param $field
     * @param $order
     * @param $limit
     * @return false|\PDOStatement|string|\think\Collection
     * 去掉重复
     */
    public function distinct($distinct = 'a', $alias = 'a', $join = [], $where, $field, $order, $limit)
    {
        return Db::name($this->tableName)->distinct(true)->alias($alias)->join($join)->where($where)->field($field)->order($order)->limit($limit)->select();
    }

    /**
     * @param string $where
     * @return int|string
     * 聚合函数
     */
    /*public function count($where){
        return Db::name($this->tableName)->where($where)->count();
    }*/


    /**
     * 两次联表分页查询
     * @param $join
     * @param $in 第二次
     * @param array $where
     * @param string $field
     * @param string $order
     * @param string $limit
     * @return false|\PDOStatement|string|\think\Collection
     */
    public function join_Page($page, $join, $in, $alias, $where = [], $field = '*', $limit = '10', $order = 'time', $sort = 'desc')
    {
        return Db::name($this->tableName)->alias($alias)->field($field)->join($join[0], $join[1])->join($in[0], $in[1])->where($where)->order($order, $sort)->limit($limit)->page($page)->select();
    }

    /**
     * 连表查询单条信息
     * @param $join
     * @param $in 第二次
     * @param array $where
     * @param string $field
     * @return array|false|\PDOStatement|string|Model
     */
    public function join_find($join, $in, $where = [], $field = '*', $alias)
    {
        return Db::name($this->tableName)->alias($alias)->field($field)->join($join[0], $join[1])->join($in[0], $in[1])->where($where)->find();
    }



}